/*
 * ArchivoUtils.h
 *
 *  Created on: 19/05/2013
 *      Author: jonathan
 */

#ifndef ARCHIVOUTILS_H_
#define ARCHIVOUTILS_H_
#include "../typedefs.hpp"
#include "bitstream.h"
#include <list>
#include <sstream>
using namespace std;

// Checkea si el archivo fileName existe
bool fileExists(const FileName& fileName);

// Borra el archivo, tira excepcion si no pudo borrarse;
void removeFile(const FileName& fileName);

PunteroPosiciones leerNumeroVariableLargo(BitStream*, EnteroLargo longitud);
EnteroLargo leerNumeroVariable(BitStream*, EnteroLargo longitud);
void escribirNumeroVariable(BitStream* stream, EnteroLargo numero,
		EnteroLargo longitudMinima);

void escribirNumeroVariableLargo(BitStream* stream, PunteroPosiciones numero,
		EnteroLargo longitudMinima);

//como maximo 63 bits.>
PunteroPosiciones leerBinario(BitStream*, int cantBits);
void escribirBinario(BitStream*, PunteroPosiciones, int cantBits);

string to_string(EnteroLargo nro);
class FileList {
private:
	list<string> archivos;
	list<string>::iterator it;
public:
	// Construye una instancia donde se recorren todos los archivos dentro de dir
	FileList(const FileName& dir, const FileName& extension);
	// Devuelve true si hay un prox. elem, false si no hay mas
	bool hasNext();
	// Devuelve el archivo actual en el listado
	FileName current();
	//Devuelve el proximo y avanza el puntero
	FileName next();
	// Devuelve la cantidad de archivos indexados
	size_t count();

};


class FileNameBuilder{
private:
	string stream;
public:
	FileName toFileName();
	void append(EnteroLargo);
	void append(string);
	void append(FileName);
};
#endif /* ARCHIVOUTILS_H_ */
